/* 
 * UnidadeDepartamentoDAO.java
 * Copyright (c) Faculdade Anhanguera de Anápolis.
 * Tecnologia em Análise e Desenvolvimento de Sistemas.
 * Projeto Multidisciplinar de Autoaprendizagem.
 *
 * Este software é confidencial e propriedade da Faculdade Anhanguera de Anápolis.
 * Não é permitida sua distribuição ou divulgação do seu conteúdo sem expressa autorização da Faculdade Anhanguera de Anápolis.
 * Este arquivo contém informações proprietárias.
 */
package br.com.pma.chamatec.dao;

import java.util.List;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import br.com.pma.chamatec.exception.ChamatecNegocioException;
import br.com.pma.entity.Departamento;
import br.com.pma.entity.Unidade;
import br.com.pma.entity.UnidadeDepartamento;

/**
 * DAO de acesso a dados da tabela UnidadeDepartamento.
 *
 * @author Ludemeula Fernandes de Sá
 */
public class UnidadeDepartamentoDAO extends GenericChamatecDAO<UnidadeDepartamento> {
	private static final long serialVersionUID = -4058208976882761558L;

	/**
	 * Pesquisa os dados de Unidades vinculados com departamentos.
	 * 
	 * @param unidade
	 * @return
	 * @throws ChamatecNegocioException
	 */
	public List<UnidadeDepartamento> pesquisarPorUnidade(Unidade unidade) throws ChamatecNegocioException {
		List<UnidadeDepartamento> retorno = null;
		try {
			
			CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<UnidadeDepartamento> criteria = builder.createQuery(UnidadeDepartamento.class);
			Root<UnidadeDepartamento> root = criteria.from(UnidadeDepartamento.class);

			Predicate whereUnidade = builder.equal(root.get("unidade"), unidade);
			criteria.where(whereUnidade);

			root.fetch("unidade");
			root.fetch("departamento");
			criteria.select(root).orderBy(builder.asc(root.get("id")));
			retorno = getEntityManager().createQuery(criteria).getResultList();
		} catch (Exception e) {
			throw new ChamatecNegocioException(e);
		}
		return retorno;
	}

	/**
	 * Pesquisa os dados de UnidadeDepartamento vinculados com departamentos.
	 * 
	 * @param departamento
	 * @return
	 * @throws ChamatecNegocioException
	 */
	public List<UnidadeDepartamento> pesquisarPorDepartamento(Departamento departamento) throws ChamatecNegocioException {
		List<UnidadeDepartamento> retorno = null;
		try {
			CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
			CriteriaQuery<UnidadeDepartamento> criteria = builder.createQuery(UnidadeDepartamento.class);
			Root<UnidadeDepartamento> root = criteria.from(UnidadeDepartamento.class);
			Predicate whereDepartamento = builder.equal(root.get("departamento"), departamento);
			criteria.where(whereDepartamento);
			criteria.select(root).orderBy(builder.asc(root.get("id")));
			retorno = getEntityManager().createQuery(criteria).getResultList();
		} catch (Exception e) {
			throw new ChamatecNegocioException(e);
		}

		return retorno;
	}
}